<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    每个函数都有一个prototype属性, 我们称之为显式原型(属性), 
          它的值是一个对象, 我们称之为原型对象(如果函数是我们定义, 就是Object实例对象)
    每个实例都有一个__proto__属性, 我们称之为隐式原型(属性), 它的值就是构造函数prototype属性值, 它也指向原型对象
    */
    function Fn() {
      
    }
    const fn = new Fn()


    /* 
    为什么一上来就能定义函数, 就能创建Object的实例

    js引擎在开始解析我们的代码前, 会先运行内置的代码
      function Function () {}
      Function.prototye.call = function () {}
      function Object () {}
      Object.prototype.toString = function (){}
    */

    /* 
    执行函数定义
    执行/调用函数
    */

    function fun() {
      
    }
    /* 
    内部执行的代码:
    const fun = new Function ()  // 创建Function的实例对象 简称函数对象
    this.prototype = {}
    this.prototype.constructor = fun
    this.__proto__ = Function.prototype

    */
   console.log(Function.prototype.__proto__===Object.prototype)  // true
   console.log(Function.prototype)
   /* 
   Function原型对象本质是函数, 它的__proto__属性, 是内部强加上去的
    Function.prototype.__proto__ = Object.prototype
   */

  </script>
</body>
</html>